package db

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"yuanaiproblem/config"

	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

var DB *gorm.DB // 全局数据库连接
// Init 初始化全局数据库连接
func Init() error {
	var err error
	DB, err = InitDB(config.Env.DBPath)
	if err != nil {
		fmt.Printf("数据库初始化失败: %v\n", err)
		return fmt.Errorf("初始化数据库失败: %w", err)
	}
	fmt.Println("数据库初始化成功")
	return nil
}

// InitDB 初始化SQLite数据库并执行同目录下的db.sql创建表
func InitDB(dbPath string) (*gorm.DB, error) {
	// 创建数据库文件目录（如果不存在）
	dbDir := filepath.Dir(dbPath)
	if _, err := os.Stat(dbDir); os.IsNotExist(err) {
		if err := os.MkdirAll(dbDir, 0755); err != nil {
			return nil, fmt.Errorf("创建数据库目录失败: %v", err)
		}
	}
	// 打开数据库连接
	gormDB, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{})
	if err != nil {
		return nil, fmt.Errorf("无法打开数据库: %v", err)
	}
	// 测试连接
	sqlDB, err := gormDB.DB()
	if err != nil {
		return nil, fmt.Errorf("获取底层 SQL 连接失败: %v", err)
	}
	if err := sqlDB.Ping(); err != nil {
		return nil, fmt.Errorf("无法连接到数据库: %v", err)
	}
	// 获取项目根目录
	rootDir, err := config.FindRootDir()
	if err != nil {
		return nil, fmt.Errorf("无法定位项目根目录: %v", err)
	}
	// 读取SQL脚本
	sqlPath := filepath.Join(rootDir, "migrations/db", "db.sql")
	fmt.Println(sqlPath)
	sqlScript, err := ioutil.ReadFile(sqlPath)
	if err != nil {
		return nil, fmt.Errorf("无法读取SQL脚本(路径: %s): %v", sqlPath, err)
	}

	// 执行SQL 脚本创建表
	if err := gormDB.Exec(string(sqlScript)).Error; err != nil {
		return nil, fmt.Errorf("执行SQL脚本失败: %v\nSQL内容: %s", err, sqlScript)
	}

	return gormDB, nil
}
